package com.jrx.anytxn.customer.mapper.ext;

import com.jrx.anytxn.customer.entity.CmCustomerLimitInfo;
import com.jrx.anytxn.customer.mapper.base.CmCustomerLimitInfoMapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * 客户额度表的接口扩展
 *
 * @author Qingyao Xing
 * @date 2019/7/18 17:20
 */
public interface ExtCmCustomerLimitInfoMapper extends CmCustomerLimitInfoMapper {

    /**
     * 根据产品ID,客户ID,组织号关联查询客户额度与节点映射表的信息
     *
     * @param limitIdList      额度id集合
     * @param organizationId 机构号
     * @param customerId     客户id
     * @param tenantId       租户id
     * @return java.util.List<CmCustomerLimitInfo> 客户额度数据的list集合
     * @author Qingyao Xing
     * @date 2019/8/15 18:19
     */
    List<CmCustomerLimitInfo> selectCusLimitByPrdAndCusIdAndOrgId(@Param("limitIdList") List<String> limitIdList , @Param("organizationId") String organizationId, @Param("channel") String channel,@Param("customerId") String customerId, @Param("tenantId") String tenantId, @Param("status") String status);

    /**
     * 根据客户ID,机构号，状态查询客户额度数据集合
     *
     * @param organizationId 机构号
     * @param customerId     客户id
     * @param tenantId       租户id
     * @return java.util.List<com.jrx.anytxn.customer.entity.CmCustomerLimitInfo> 客户额度信息集合
     * @author Qingyao Xing
     * @date 2019/8/16 9:29
     */
    List<CmCustomerLimitInfo> selectCusLimitListByCusId(@Param("organizationId") String organizationId, @Param("customerId") String customerId, @Param("tenantId") String tenantId);

    /**
     * 更新枝节点额度
     *
     * @param copy 客户额度的信息对象
     * @return int 修改结果
     * @author Qingyao Xing
     * @date 2019/7/24 16:29
     */
    int updateCustomerLimitNewPerm(CmCustomerLimitInfo copy);

    /**
     * 批量添加客户额度信息
     *
     * @param list 添加的客户额度对象集合
     * @return int 添加成功数量
     * @author Qingyao Xing
     * @date 2019/8/5 9:13
     */
    int insertListSelective(List<CmCustomerLimitInfo> list);

    /**
     * 查询客户额度信息
     *
     * @param customerId     客户ID
     * @param organizationId 机构ID
     * @param limitId        额度节点ID
     * @param contractNumber 合同号
     * @param tenantId       租户id
     * @return com.jrx.anytxn.customer.entity.CmCustomerLimitInfo
     * @author: fan.yang
     * @date: 2019/9/24 0024 下午 16:37
     */
    CmCustomerLimitInfo selectCustomerLimitInfo(@Param("customerId") String customerId, @Param("organizationId") String organizationId, @Param("limitId") String limitId, @Param("contractNumber") String contractNumber, @Param("tenantId") String tenantId);

    /**
     * 查询渠道客户额度信息
     *
     * @param customerId     客户ID
     * @param organizationId 机构ID
     * @param limitId        额度节点ID
     * @param contractNumber 合同号
     * @param tenantId       租户id
     * @param channel       租户id
     * @return com.jrx.anytxn.customer.entity.CmCustomerLimitInfo
     * @author: fan.yang
     * @date: 2019/9/24 0024 下午 16:37
     */
    CmCustomerLimitInfo selectByChannel(@Param("customerId") String customerId,
                                @Param("organizationId") String organizationId, @Param("limitId") String limitId,
                                        @Param("contractNumber") String contractNumber,
                                        @Param("tenantId") String tenantId, @Param("channel") String channel);

    /**
     * 获取客户额度数
     * @param customerId
     * @param organizationId
     * @param tenantId
     * @return
     */
    int selectCountLimit(@Param("customerId") String customerId,
                         @Param("organizationId") String organizationId,
                         @Param("tenantId") String tenantId);

    /**
     * 根据客户ID，机构号，渠道，额度节点ID更新客户额度信息
     *
     * @param cmCustomerLimitInfo 额度额度信息实体
     * @return int
     * @author: fan.yang
     * @date: 2019/9/24 0024 下午 16:38
     */
    int updateCustomerLimit(CmCustomerLimitInfo cmCustomerLimitInfo);

    /**
     * 额度调整接口的方法
     *
     * @param cmCustomerLimitInfo 客户额度的信息实体
     * @return int 修改结果
     * @author Qingyao Xing
     * @date 2019/8/7 14:11
     */
    int updateCustomerLimitAdjust(CmCustomerLimitInfo cmCustomerLimitInfo);

    /**
     * 根据机构号，客户id,非失效客户额度的额度树
     *
     * @param organizationId 机构号
     * @param customerId     客户id
     * @param limitStatus         状态
     * @param tenantId       租户id
     * @return java.util.List<java.util.Map < java.lang.String, java.lang.Object>> 客户额度的部分数据的map集合的list集合
     * @author Qingyao Xing
     * @date 2019/8/8 13:39
     */
    List<CmCustomerLimitInfo> selectCusLimitByCusIdAndOrgIdAndStatus(@Param("organizationId") String organizationId, @Param("customerId") String customerId, @Param("limitStatus") String limitStatus, @Param("tenantId") String tenantId);

    /**
     * 额度冻结/解冻方法
     *
     * @param customerLimitInfo 客户额度的实体
     * @return int 修改结果
     * @author Qingyao Xing
     * @date 2019/8/8 20:34
     */
    int updateCustomerLimitStatus(CmCustomerLimitInfo customerLimitInfo);

    /**
     * 根据条件查询客户额度数据
     *
     * @param cond 查询条件
     * @return 客户额度数据
     */
    List<CmCustomerLimitInfo> selectByCondition(@Param("cond") CmCustomerLimitInfo cond);

    /**
     * 还款时修改客户额度
     *
     * @param customerLimitInfo
     * @author Qingyao Xing
     * @date 2019/10/22 11:25
     */
    int updateCustomerLimitPayment(CmCustomerLimitInfo customerLimitInfo);

    /**
     * 根据流水号查询
     * @param seqNo
     * @param customerId
     * @param tenantId
     * @return
     */
    int selectCountBySeqNo(@Param("seqNo")String seqNo, @Param("customerId")String customerId, @Param("tenantId")String tenantId);

    CmCustomerLimitInfo selectById(@Param("customerId") String customerId, @Param("id") Long id, @Param("tenantId") String tenantId);


    /**
     * 根据以下条件查询客户额度信息
     * @author fan.yang
     * date: 2020/4/10 0010 上午 11:54
     * @param tenantId 租户ID
     * @param customerId 客户ID
     * @param limitId 额度节点ID
     * @return com.jrx.anytxn.customer.entity.CmCustomerLimitInfo
     */
    CmCustomerLimitInfo selectByTenIdAndCusIdAndLimitId(@Param("tenantId") String tenantId,@Param("customerId") String customerId,@Param("limitId") String limitId);

    /**
     * 根据条件查询父节点下所有子节点
     * @param organizationId
     * @param customerId
     * @param limitStatus
     * @param tenantId
     * @param fatherId
     * @return
     */
    List<CmCustomerLimitInfo> selectCusLimitByCusIdAndOrgIdAndStatusAndfatherId(@Param("organizationId") String organizationId,
                                                                                @Param("customerId") String customerId,
                                                                                @Param("limitStatus") String limitStatus,
                                                                                @Param("tenantId") String tenantId,
                                                                                @Param("fatherId") String fatherId);

    /**
     * 统计客户银行卡信息的数量
     *
     * @return int
     */
    int selectCountForBatch();

    /**
     * 汇总所有客户当前额生效度
     *
     * @return BigDecimal
     */
    BigDecimal selectSumLimitAmount();

    /**
     * 汇总所有客户已使用额度
     *
     * @return BigDecimal
     */
    BigDecimal selectSumLimitUsed();

    /**
     * 汇总所有客户可用额度
     *
     * @return BigDecimal
     */
    BigDecimal selectSumLimitAvailable();

    /**
     * 根据创建时间，额度节点ID获取客户额度信息
     * @param updateTime
     * @param limitIdList
     * @return
     */
    List<CmCustomerLimitInfo> selectAllByUpdateTimeAndLimitIds(@Param("updateTime") String updateTime,
                                                              @Param("limitIdList") List<String> limitIdList);

    void batchInsert(List<CmCustomerLimitInfo> list);

    /**
     * 根据客户id,租户id,渠道号,节点id,节点状态,外部合同号查询客户额度信息
     * @param customerId 客户id
     * @param tenantId 租户id
     * @param channel 渠道号
     * @param limitId 节点id
     * @param limitStatus 节点状态
     * @param contractNumber 外部合同号
     * @return CmCustomerLimitInfo
     */
    CmCustomerLimitInfo selectCancelCreditCustomerLimitInfo(@Param("customerId") String customerId,
                                                            @Param("tenantId") String tenantId,
                                                            @Param("channel") String channel,
                                                            @Param("limitId") String limitId,
                                                            @Param("limitStatus") String limitStatus,
                                                            @Param("contractNumber") String contractNumber);

    /**
     *
     * 查询该用户的所有额度节点
     *
     * @author 张靖烽
     * @param tenantId
     * @param customerId
     * @param status
     * @createtime 2021-03-30 18:17
     * @return List<CmCustomerLimitInfo>
     */
    List<CmCustomerLimitInfo> selectAllCustomerLimitInfo(@Param("tenantId") String tenantId, @Param("customerId") String customerId, @Param("status") String status);

    /**
     *
     * 批量更新额度信息
     *
     * @author 张靖烽
     * @param cmCustomerLimitInfoList 额度额度信息实体
     * @createtime 2021-03-30 18:17
     */
    void batchUpdateCustomerLimitInfo(List<CmCustomerLimitInfo> cmCustomerLimitInfoList);

    /**
     * 查询指定客户编号的额度集合
     * @param customerId
     * @param tenantId
     * @param organizationId
     * @param limitIds
     * @param status
     * @return
     */
    List<CmCustomerLimitInfo> selectCustLimitsWithin(@Param("customerId") String customerId, @Param("tenantId") String tenantId, @Param("organizationId") String organizationId, @Param("limitIds") List<String> limitIds, @Param("status") String status);

    /**
     * 查询额度即将过期的客户
     * @param tenantId
     * @param days
     * @param status
     * @return
     */
    List<CmCustomerLimitInfo> selectLimitRenewalSmsCus(@Param("tenantId") String tenantId, @Param("days") List<String> days, @Param("status") String status);

    /**
     * 查询额度即将过期的客户
     * @param tenantId
     * @param beginDay
     * @param endDay
     * @param status
     * @return
     */
    List<CmCustomerLimitInfo> selectLimitRenewalCus(@Param("tenantId") String tenantId, @Param("beginDay") String beginDay, @Param("endDay") String endDay, @Param("status") String status);

    /**
     * 查询指定客户编号的额度集合
     *
     * @param customerId
     * @param tenantId
     * @param organizationId
     * @param limitIds
     * @param status
     * @return
     */
    List<CmCustomerLimitInfo> selectCustLimits(@Param("customerId") String customerId, @Param("tenantId") String tenantId, @Param("organizationId") String organizationId,
                                                     @Param("limitIds") List<String> limitIds, @Param("status") List<String> status);

}
